home *** CD-ROM | disk | FTP | other *** search
Text File | 1989-09-27 | 19.2 KB | 817 lines | [TEXT/nX^n] |
- int storeHanInGlobal(paramPtr, globalName, han)
- /*
- Convert the handle to HexStr representation and
- store in the HC global container globalName.
- If handle is zero, store empty in the global.
- This lets the HyperCard script test to see if
- memory has been allocated (not empty == allocated).
-
- Returns result code.
- */
- XCmdPtr paramPtr;
- char *globalName;
- Handle han;
- {
- Handle tempHan;
- Str255 tempPstr;
- char hanCstr[kMaxLenLine];
-
- if(han==NIL)
- strcpy(hanCstr, kEmptyStr);
- else
- convertHanToHexStr(hanCstr, han); /* convert handle to hex strng */
- copyCtoPstr(tempPstr, globalName); /* make Pascal version of name */
- tempHan = CopyStrToHand(hanCstr); /* store string for passing */
- SetGlobal(paramPtr, tempPstr, tempHan); /* store contents into global */
- DisposHandle(tempHan);
- return MemError();
- } /* -------------------------------------------- storeHanInGlobal */
-
- int fetchHanFromGlobal(paramPtr, globalName, han)
- /*
- Fetch the handle stored in HexStr
- in the HC global container globalName.
-
- Returns result code:
- TRUE successful, found handle
- FALSE handle is NIL
- */
- XCmdPtr paramPtr; /* HyperCard connection */
- char *globalName; /* name of global */
- Handle *han; /* pointer to handle */
- {
- Handle hGlobalString; /* string stored in global */
- Str255 tempPstr;
-
- copyCtoPstr(tempPstr, globalName); /* copy, not in-place conv */
- HLock(hGlobalString = GetGlobal(paramPtr, tempPstr));
- convertHexStrtoHan(han, *hGlobalString);
- HUnlock(hGlobalString);
- if(*han==NIL)
- return FALSE;
- else
- return TRUE;
- } /* -------------------------------------------- fetchHanFromGlobal */
-
- void convertHanToHexStr(hexStr, han)
- /*
- Convert the Handle to 8-char (+ terminator) hex string representation.
- */
- char *hexStr;
- Handle han;
- {
- short digit,
- shiftCnt = 32;
-
- do
- {
- shiftCnt -= 4;
- digit = '0' + (((short) ( (long) han >> shiftCnt)) & 0x000F);
- if(digit > '9')
- digit += 7; /* A-F hex digit */
- *hexStr++ = digit;
- }
- while(shiftCnt>0);
- *hexStr = '\0'; /* add terminator */
- } /* -------------------------------------------- convertHanToHexStr */
-
- void convertHexStrtoHan(han, hexStr)
- /*
- Convert the hex string representation to a Handle.
- The HexStr representation must be a C-string.
- Only the least-significant 8 hex digits are used.
- Assumes that handle is already locked.
-
- Returns NIL for handle if there are not 8 hex digits.
- */
- Handle *han;
- char *hexStr;
- {
- unsigned long digit,
- hanVal=0L;
- short shiftCnt=0,
- i;
- Str255 tempPstr;
-
- if(strlen(hexStr)!=8)
- {
- *han = NIL;
- return;
- }
- copyCtoPstr(tempPstr, hexStr);
- for(i=tempPstr[0]; i>0 && shiftCnt < 32; i--)
- {
- digit = tempPstr[i] - '0'; /* unsigned, result is positive */
- if(digit>9L)
- digit -= 7L; /* A-F hex digit */
- if(digit>'F')
- {
- *han = NIL;
- return;
- }
- digit <<= shiftCnt; /* shift left */
- hanVal = hanVal | digit; /* insert value */
- shiftCnt += 4;
- }
- *han = (Handle) hanVal;
- } /* -------------------------------------------- convertHexStrtoHan */
-
- void copyCtoPstr(Pstr, Cstr)
- /*
- Copy the Cstr to the Pstr.
- Allows us to make a P-string copy without
- doing it in-place.
- */
- Str255 Pstr;
- char *Cstr;
- {
- short i=0;
-
- while(*Cstr!=0)
- Pstr[++i] = *Cstr++;
- Pstr[0] = i;
- } /* -------------------------------------------- copyCtoPstr */
-
- /* -----------------------------------------------------------------
- Program: TriData3270 XFCN
-
- Version: v2
-
- History: 05/04/89 v1, original
- 07/04/89 v2, revised memory model
-
- Author: John R. Powers, III
- Easy Street Software
- 16373 Alexander Avenue
- Monte Sereno, CA 95030
- (408) 395-1158
- (408) 395-3308 msg.
-
- Computer: Mac II with System v6.0.2
-
- Compiler: MPW-C v3.0
-
- Usage:
-
- get TriData3270("command", "session", SAM, params, "container")
-
- Requires HyperCard version 1.2 or better.
-
- Files:
-
- TriData3270.c This source file
- TD3270main.c CODE called by TriData3270State
- TriData3270 Lab HyperCard stack for testing
- TriData3270.h General header
-
- Full Build:
-
- # TriData3270 XFCN
- C -b TriData3270.c -mbg off -sym off
- Link ∂
- -rt XFCN=16373 ∂
- -m ENTRYPOINT ∂
- -sg TriData3270 ∂
- TriData3270.c.o ∂
- "{Libraries}"Interface.o ∂
- "{CLibraries}"StdCLib.o ∂
- -o "TriData3270 Lab"
- save -a
-
- ----------------------------------------------------------------- */
-
- #include <HyperXCmd.h>
- #include <Memory.h>
- #include <Types.h>
- #include <Resources.h>
-
- #include "TriData3270.h"
-
- /*
- Prototypes.
- */
-
- void makeHexStr(char *hexStr, short value);
- void pTD3270main (XCmdPtr paramPtr, short opFlag);
-
- /*
- Main program and entry point for XFCN.
-
- Get common code resource and continue with that.
- Use opFlag = kOp3270 (TriData3270 XFCN).
- */
-
- pascal void entryPoint(paramPtr)
-
- XCmdPtr paramPtr; /* the HyperCard connection */
- {
- short opFlag=kOp3270,
- result;
- char msg[kMaxLenLine];
- Handle hMsg,
- hTD3270main;
- ProcPtr pTD3270main;
-
- hTD3270main = GetNamedResource(kRsrcMainType, kRsrcMainName);
- result = ResError();
- if(result!=noErr)
- {
- makeHexStr(msg, result);
- hMsg = (Handle) NewHandle((long) (strlen(msg)+1));
- HLock(hMsg);
- strcpy(*hMsg, msg);
- HUnlock(hMsg);
- paramPtr->returnValue = hMsg;
- return;
- }
- LoadResource(hTD3270main);
- MoveHHi(hTD3270main);
- HLock(hTD3270main);
- pTD3270main = (ProcPtr) *hTD3270main;
- pTD3270main (paramPtr, opFlag);
- HUnlock(hTD3270main);
- ReleaseResource(hTD3270main);
- return;
- } /* -------------------------------------------- entryPoint */
-
- void makeHexStr(hexStr, value)
- /*
- Convert the value to 4-char (+ terminator) hex string representation.
- */
- char *hexStr;
- short value;
- {
- short digit,
- shiftCnt = 16;
-
- while(shiftCnt>0);
- {
- shiftCnt -= 4;
- digit = '0' + ((value>>shiftCnt) & 0x000F);
- if(digit > '9')
- digit += 7; /* A-F hex digit */
- *hexStr++ = digit;
- }
- *hexStr = '\0'; /* add terminator */
- } /* -------------------------------------------- makeHexStr */
-
- /* -----------------------------------------------------------------
- Program: TriData3270State XFCN
-
- Version: v1.0a
-
- History: xx/xx/89 v1.0a, original
-
- Author: John R. Powers, III
- Easy Street Software
- 16373 Alexander Avenue
- Monte Sereno, CA 95030
- (408) 395-1158
- (408) 395-3308 msg.
-
- Computer: Mac II with System v6.0.2
-
- Compiler: MPW-C v3.0
-
- Usage:
-
- get TriData3270State(command, session)
-
- Requires HyperCard version 1.2 or better.
-
- Files:
-
- TriData3270State.c This source file
- TD3270main.c CODE called by TriData3270State
- TriData3270 Lab HyperCard stack for testing
- TriData3270.h General header
-
- Full Build:
-
- # TriData3270State XFCN
- C -b TriData3270State.c -mbg off -sym off
- Link ∂
- -rt XFCN=16374 ∂
- -m ENTRYPOINT ∂
- -sg TriData3270State ∂
- TriData3270State.c.o ∂
- "{Libraries}"Interface.o ∂
- "{CLibraries}"StdCLib.o ∂
- -o "TriData3270 Lab"
- save -a
-
- ----------------------------------------------------------------- */
-
- #include <HyperXCmd.h>
- #include <Memory.h>
- #include <Types.h>
- #include <Resources.h>
-
- #include "TriData3270.h"
-
- /*
- Prototypes.
- */
-
- void makeHexStr(char *hexStr, short value);
- void pTD3270main (XCmdPtr paramPtr, short opFlag);
-
- /*
- Main program and entry point for XFCN.
-
- Get common code resource and continue with that.
- Use opFlag = kOp3270State (TriData3270State XFCN).
- */
-
- pascal void entryPoint(paramPtr)
-
- XCmdPtr paramPtr; /* the HyperCard connection */
- {
- short opFlag=kOp3270State,
- result;
- char msg[kMaxLenLine];
- Handle hMsg,
- hTD3270main;
- ProcPtr pTD3270main;
-
- hTD3270main = GetNamedResource(kRsrcMainType, kRsrcMainName);
- result = ResError();
- if(result!=noErr)
- {
- makeHexStr(msg, result);
- hMsg = (Handle) NewHandle((long) (strlen(msg)+1));
- HLock(hMsg);
- strcpy(*hMsg, msg);
- HUnlock(hMsg);
- paramPtr->returnValue = hMsg;
- return;
- }
- LoadResource(hTD3270main);
- MoveHHi(hTD3270main);
- HLock(hTD3270main);
- pTD3270main = (ProcPtr) *hTD3270main;
- pTD3270main (paramPtr, opFlag);
- HUnlock(hTD3270main);
- ReleaseResource(hTD3270main);
- return;
- } /* -------------------------------------------- entryPoint */
-
- void makeHexStr(hexStr, value)
- /*
- Convert the value to 4-char (+ terminator) hex string representation.
- */
- char *hexStr;
- short value;
- {
- short digit,
- shiftCnt = 16;
-
- while(shiftCnt>0);
- {
- shiftCnt -= 4;
- digit = '0' + ((value>>shiftCnt) & 0x000F);
- if(digit > '9')
- digit += 7; /* A-F hex digit */
- *hexStr++ = digit;
- }
- *hexStr = '\0'; /* add terminator */
- } /* -------------------------------------------- makeHexStr */
-
- /*
- main program and entry point
-
- The is intended to be called as a CODE resource,
- not an XCMD or XFCN.
-
- Call with opFlag==kOp3270 for TriData3270 functionality.
- Call with opFlag==kOp3270State for TriData3270State functionality.
-
- TriData3270State is a subset of TriData3270. There is
- so much common code that this approach eliminates
- redundant source and object code.
- */
-
- void entryPoint(paramPtr, opFlag)
-
- XCmdPtr paramPtr; /* the HyperCard connection */
- short opFlag;
- {
- masBlk *pMas; /* master memory pointer */
- sesBlk *pSes;
- Handle hMas, /* master block handle */
- hSes;
- char sessionGlobalName[kMaxLenName],
- command[kMaxLenCmd], /* command string */
- returnList[kMaxLenRet]; /* string list for return */
- short result, /* result code for return */
- ignore,
- debugFlag, /* debug flag */
- reqResult, /* result code from API */
- status, /* verb queue status code */
- cmdNum, /* command number */
- blockIndx, /* queue/request block index */
- numParams, /* number of XFCN parameters */
- sessionIndx;
- WORD wIgnore;
- /* Map command index to */
- /* req and queue indexes */
- short blockIndxTable[] =
- {
- kIndxConnPS, /* ConnPS */
- kIndxCpyToPS, /* CpyToPS */
- kIndxDiscPS, /* DiscPS */
- kIndxGetCurs, /* GetCurs */
- kIndxSendKey, /* SendKey */
- kIndxSetCurs, /* SetCurs */
- kIndxCpyfBuf, /* CpyfBuf */
- kIndxGetUpd, /* GetUpd */
- kIndxCloseHC, /* CloseHC (no queue) */
- kIndxOpenHC, /* OpenHC (no queue) */
- kIndxSendKey, /* SendAID => SendKey */
- kIndxSendKey, /* SendText => SendKey */
- kIndxInit, /* no queue and no request blocks */
- kIndxTerm /* no queue and no request blocks */
- };
- /*
- Setup return string.
- Check for opFlag validity.
- */
- *returnList = kCterm;
- if(opFlag!=kOp3270 && opFlag!=kOp3270State)
- {
- resultForHC(paramPtr, kRcHuhOp, returnList);
- return;
- }
-
- void getContainerData(paramPtr, container, hGlobalData)
- /*
- Get the data from the container described in "container".
- The kTmpGlobalPname is a hypercard global used for temporary storage.
- Return a handle to the HyperCard data.
- The HyperCard data is stored as a C string.
-
- Method:
-
- Send a message to HC to put the data into a global.
- Get the contents of the global.
-
- Requires that a global by name of globalName
- already be defined.
- */
- XCmdPtr paramPtr;
- char *container;
- Handle *hGlobalData;
- {
- char msg[kMaxLenLine],
- globalName[kMaxLenGlobal];
- Str255 globalPname;
- Handle hTemp;
-
- /* create global */
- copyPstr(globalPname, kTmpGlobalPname);
- copyPtoCstr(globalName, globalPname);
- hTemp = putGlobal(paramPtr, globalPname, container);
- /* put container into global */
- strcpy(msg, "put ");
- strcat(msg, container);
- strcat(msg, " into ");
- strcat(msg, globalName);
- SendCstrHCMsg(paramPtr, msg);
- /* "SendHCMsg error in get: " */
- CHK_CALLBACK_ERR(msg);
- /* get data from global */
- *hGlobalData = GetGlobal(paramPtr, globalPname);
- /* "GetGlobal error (copy) in get:"*/
- CHK_CALLBACK_ERR(globalName);
- DisposHandle(hTemp);
-
- } /* -------------------------------------------- getContainerData */
-
- int putContainerData(paramPtr, container, hData)
- /*
- Put the hData into the container described in "container".
- The HyperCard data is stored as a C string.
- hData is checked for non-NIL before proceeding.
- Returns TRUE if the put was done.
-
- Method:
-
- Create a HC global.
- Copy the data to the HC global.
- Send a message to HC to put the global into a container.
- */
- XCmdPtr paramPtr;
- char *container;
- Handle hData;
- {
- char msg[kMaxLenLine],
- globalName[kMaxLenGlobal];
- Str255 globalPname;
- Handle hTemp;
-
- /* make sure we have desc and handle */
- if(hData==NIL || strlen(container)<=0)
- return FALSE;
- /* create global */
- copyPstr(globalPname, kTmpGlobalPname);
- copyPtoCstr(globalName, globalPname);
- hTemp = putGlobal(paramPtr, globalPname, container);
- /* have container desc and handle */
- /* copy handle data to temp HC global */
- SetGlobal(paramPtr, globalPname, hData);
- /* "SetGlobal error (copy) in put: " */
- CHK_CALLBACK_ERR(globalName);
- /* Have HC copy from global to container */
- strcpy(msg, "put ");
- strcat(msg, globalName);
- strcat(msg, " into ");
- strcat(msg, container);
- SendCstrHCMsg(paramPtr, msg);
- /* "SendHCMsg error in put: " */
- CHK_CALLBACK_ERR(msg);
- DisposHandle(hTemp);
- return TRUE;
- } /* -------------------------------------------- putContainerData */
-
- #define CHK_CALLBACK_ERR(str) \
- { \
- short result; \
- char msg[128]; \
- if((result=paramPtr->result)!=0) \
- { \
- strcpy(msg, "HC callback error: "); \
- strcat(msg, str); \
- DebugStr(ToPstr(msg)); \
- } \
- }
-
- typedef struct
- {
- short num_sessions;
- short reserved;
- char method_global_name[kMaxLenName];
- Handle hSession[kMaxSessions];
- } masBlk;
-
- typedef struct
- {
- char session_global_name[kMaxLenName];
- BYTE conn_id;
- BYTE port_id;
- BYTE ps_id;
- BYTE flags;
- char status[kMaxLenStat];
- Handle hAPIvars;
- Handle hReq[kMaxReq];
- Handle hQueue[kMaxQ];
- Handle hTable[kMaxTab];
- short tableLen[kMaxTab];
- Handle hBuffer[kMaxBuf];
- Handle hRecord[kMaxRec];
- } sesBlk;
-
- "masHan", {
- "master handle", "^masBlk", 1
- },
-
- "masBlk", {
- "num_sessions", "Word", 1,
- "reserved", "Word", 1,
- "method name", "Text", 32,
- "hSession1", "^^sesBlk", 1,
- "hSession2", "^^sesBlk", 1,
- "hSession3", "^^sesBlk", 1,
- "hSession4", "^^sesBlk", 1,
- "hSession5", "^^sesBlk", 1,
- "hSession6", "^^sesBlk", 1,
- "hSession7", "^^sesBlk", 1,
- "hSession8", "^^sesBlk", 1
- },
-
- "sesBlk", {
- "global_name", "Text", 32,
- "conn_id", "Byte", 1,
- "port_id", "Byte", 1,
- "ps_id", "Byte", 1,
- "flags", "Byte", 1,
- "status", "Text", 12,
- "hAPIvars", "Long", 1,
- "hReq0-4", "Long", 5,
- "hReq5-9", "Long", 5,
- "hQueue0-3", "Long", 4,
- "hQueue4-7", "Long", 4,
- "hTables0-4", "Long", 5,
- "tableLen0-4", "Word", 5,
- "hBuffer", "Long", 6,
- "hRecord", "Long", 4
- },
-
- /* -----------------------------------------------------------------
- Program: DebugStr XCMD
-
- Version: v1.0a
-
- History: 05/01/89 v1.0a, original
- 05/19/89 v1.1, use NewHandle rather than "char" for P-string
- 05/25/89 v1.2, pass HC Handle directly rather than copy
-
- Author: John R. Powers, III
- Easy Street Software
- 16373 Alexander Avenue
- Monte Sereno, CA 95030
- (408) 395-1158
- (408) 395-3308 msg.
-
- Computer: Mac II with System v6.0.2
-
- Compiler: MPW-C v3.0
-
- Usage:
-
- DebugStr(string-to-pass-to-MacsBug)
-
- Requires HyperCard version 1.2 or better.
- Checks for DebugStr trap before attempting to call it.
- If not present, doesn't make call.
-
- Files:
-
- DebugStr.c This source file
- TriData3270 Lab HyperCard stack for testing
-
- Full Build:
-
- C -b DebugStr.c -mbg off -sym off
- Link -w ∂
- -rt XCMD=16373 ∂
- -m ENTRYPOINT ∂
- -sg DebugStr ∂
- DebugStr.c.o ∂
- "{Libraries}"HyperXLib.o ∂
- "{Libraries}"Interface.o ∂
- "{CLibraries}"StdCLib.o ∂
- "{CLibraries}"CRuntime.o ∂
- -o "TriData3270 Lab"
- save -a
-
- ----------------------------------------------------------------- */
-
- #include <HyperXCmd.h>
- #include <Memory.h>
- #include <OSUtils.h>
- #include <Types.h>
-
- /*
- some trap definitions in case we are not using MPW 3.0
- */
-
- #ifndef _DebugStr
- #define _DebugStr 0xABFF
- #endif
-
- #ifndef _Unimplemented
- #define _Unimplemented 0xA89F
- #endif
-
- /*
- other definitions
- */
-
- #define TRUE 1
- #define FALSE 0
-
- /*
- prototypes
- */
-
- Boolean trapAvailable(short tNumber, short tType);
- Boolean isImplemented(short trap);
- char *ToCstr(char * str);
- char *ToPstr(char * str);
-
- /*
- main program and entry point
- */
-
- pascal void EntryPoint(paramPtr)
-
- XCmdPtr paramPtr; /* the HyperCard connection */
- {
- Handle hBugCstr;
-
- if(!isImplemented(_DebugStr))
- return;
- if(paramPtr->paramCount==1)
- {
- HLock(hBugCstr = paramPtr->params[0]); /* get first parameter */
- DebugStr((Str255) ToPstr(*hBugCstr)); /* convert to P-string and pass*/
- ToCstr(*hBugCstr); /* restore to C-string */
- HUnlock(hBugCstr);
- }
- else /* no string to pass */
- Debugger();
-
- } /* -------------------------------------------- EntryPoint */
-
-
- Boolean trapAvailable(tNumber, tType)
- /*
- Test to see if the trap is available.
- Adapted from p.3-12 to 3-14 in Programmer's Guide to Multifinder.
- APDA #KMB017
- */
- short int tNumber;
- short int tType;
- {
- return(NGetTrapAddress(tNumber, tType) != GetTrapAddress(_Unimplemented));
-
- } /* end trapAvailable ----------------------- */
-
- Boolean isImplemented(trap)
- /*
- Check to see if trap is implemented.
- Adapted from p.3-12 to 3-14 in Programmer's Guide to Multifinder.
- APDA #KMB017
- */
- short int trap;
- {
- SysEnvRec theWorld;
-
- SysEnvirons(1, &theWorld); /* does this machine support trap tables? */
- if(theWorld.machineType < 0)
- return(FALSE); /* this ROM does not trap tables or trap */
- else
- return(trapAvailable(trap, ToolTrap)); /* check for trap */
-
- } /* end isImplemented ------------------ */
-
- /*
- Converts a Pascal string to a C string.
- The Pascal string is overwritten in the process.
- */
- char *ToCstr(str)
- char *str;
- {
- unsigned char length,
- i;
-
- length = str[0];
- for (i = 0; i < length; ++i) /* Shift string 1 byte to the left */
- str[i] = str[i+1];
- str[length] = 0; /* Put zero-terminator after string */
- return(str);
- }
-
-
- /*
- Convert a C string to a Pascal string.
- The C string is overwritten in the process.
- */
- char *ToPstr(str)
- char *str;
- {
- unsigned char length,
- i;
-
- for (i = 0, length = 0; str[i] != 0; ++i) /* Find end of string */
- ++length;
- while (i--) /* Shift string 1 byte to right */
- str[i+1] = str[i];
- str[0] = length; /* Put string length in 1st byte*/
- return(str);
- }
-
- short fetchDebugFlag(paramPtr, globalPname)
- /*
- Fetch the debugFlag stored in globalPname
-
- Returns the debugFlag, 0 if no global found.
- */
- XCmdPtr paramPtr; /* HyperCard connection */
- Str255 globalPname;
- {
- Handle hGlobalString; /* string stored in global */
- Str255 globalPstr;
- long longFlag;
-
- HLock(hGlobalString = GetGlobal(paramPtr, globalPname));
- copyCtoPstr(globalPstr, *hGlobalString);
- StringToNum(globalPstr, &longFlag);
- HUnlock(hGlobalString);
- return (longFlag & 0xFFFF);
- } /* -------------------------------------------- fetchDebugFlag */
-
-
- #define DEBUG_AFTER(flag) \
- { \
- if(flag==kDebugAfter||flag==kDebugBoth) \
- DebugStr("\pAfter"); \
- }
-
- #define DEBUG_BEFORE(flag) \
- { \
- if(flag==kDebugBefore||flag==kDebugBoth)\
- DebugStr("\pBefore"); \
- }
-
-